package 堵塞队列生产者消费者模式;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 *
 *  什么时候使用   阻塞队列  当里面内容满了需要进行等待  类似于订单提交 同一时间有很多订单提交肯定有一部分需要先进行等待 判断释放了不
 *
 *
 *
 *  队列
 *
 *
 *      四种 api
 *           抛出异常   不抛出异常    阻塞     阻塞超时
 *     添加
 *     获取
 *     获取头
 *
 */
public class BlockingQueQueTest {
    public static void main(String[] args) throws InterruptedException {
        test4();

    }

    private static void test1() {
//        抛出异常
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);


        arrayBlockingQueue.add(1);
        arrayBlockingQueue.add(2);
        arrayBlockingQueue.add(3);
//        添加超出长度内容 Exception in thread "main" java.lang.IllegalStateException: Queue full
//        arrayBlockingQueue.add(4);
        System.out.println(arrayBlockingQueue.element());

        arrayBlockingQueue.remove();
        arrayBlockingQueue.remove();
        arrayBlockingQueue.remove();
//        删除操作内容 就会 Exception in thread "main" java.util.NoSuchElementException
        arrayBlockingQueue.remove();
    }


    private static void test2() {
//        不抛出异常
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);


        arrayBlockingQueue.offer(1);
        arrayBlockingQueue.offer(2);
        arrayBlockingQueue.offer(3);
//        返回false
        System.out.println(arrayBlockingQueue.offer(4));
        // peek获取首元素
        System.out.println(arrayBlockingQueue.peek());

        arrayBlockingQueue.poll();
        arrayBlockingQueue.poll();
        arrayBlockingQueue.poll();
//        返回null 没有内容
        System.out.println(arrayBlockingQueue.poll());
    }



    private static void test3() throws InterruptedException {
//        不抛出异常
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);


        arrayBlockingQueue.put(1);
        arrayBlockingQueue.put(2);
        arrayBlockingQueue.put(3);
//        会一直进行堵塞 除非 有空位才会进行执行
//        arrayBlockingQueue.put(4);
//        返回false

        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
        System.out.println(arrayBlockingQueue.take());
//        会一直进行堵塞 除非 有内容才会进行执行
        arrayBlockingQueue.take();
//        返回null 没有内容
        System.out.println(arrayBlockingQueue.poll());
    }


    private static void test4() throws InterruptedException {
//        超时堵塞
        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);


        arrayBlockingQueue.offer(1);
        arrayBlockingQueue.offer(2);
        arrayBlockingQueue.offer(3);
//        堵塞超过两秒还不能插入 返回false 并且执行下面内容
        System.out.println(arrayBlockingQueue.offer(4,2, TimeUnit.SECONDS));

        arrayBlockingQueue.poll();
        arrayBlockingQueue.poll();
        arrayBlockingQueue.poll();
//        返回null 没有内容
        System.out.println(arrayBlockingQueue.poll(2,TimeUnit.SECONDS));
    }



    public boolean isZX(int target){
        int newTarget = (int)Math.sqrt(target);
        for(int i=2;i<= newTarget;i++){
            if(newTarget%i == 0){
                return false;
            }
        }
        return true;
    }

}
